"""
Python基础学习 - 继承示例代码
=========================

本文件展示了Python中继承的概念：
1. 父类与子类 - 子类如何继承父类的属性和方法
2. 方法重写 - 子类如何提供父类方法的不同实现
3. super()函数 - 如何调用父类的方法

继承是面向对象编程的核心概念之一。
在实际工作中，继承常用于创建具有共同特性的类层次结构。
例如，在电商系统中，可能有Product基类，
然后有Book、Electronics、Clothing等子类，
它们都继承Product的通用属性如价格、库存等，
同时又有各自特有的属性和方法。
"""

# 首先需要导入Person类，因为Student和Teacher类都继承自它
from class_demo import Person

class Student(Person):
    """学生类，继承自Person类 - 演示继承的概念

    Student类继承了Person类的所有属性和方法，
    并添加了学生特有的属性和方法。
    """
    
    # 重写__init__方法 - 添加学生特有的属性
    # 使用super()调用父类的__init__方法
    def __init__(self, name, age, student_id, major):
        """初始化学生对象

        Args:
            name (str): 学生姓名
            age (int): 学生年龄
            student_id (str): 学号
            major (str): 专业
        """
        # 调用父类的初始化方法，初始化继承的属性
        super().__init__(name, age)  # 初始化name和age属性
        # 添加学生特有的属性
        self.student_id = student_id  # 学号
        self.major = major            # 专业
        self.courses = []             # 选修课程列表
    
    # 添加学生特有的方法
    def enroll_course(self, course):
        """选课方法 - 添加课程到选修列表

        Args:
            course (str): 课程名称
        """
        self.courses.append(course)  # 将课程添加到列表
        print(f"{self.name}选修了{course}课程。")
    
    # 重写父类方法 - 提供学生特有的实现
    # 子类可以重写父类的方法，提供不同的实现
    def introduce(self):
        """重写自我介绍方法 - 提供学生版本的自我介绍

        Returns:
            str: 学生的自我介绍
        """
        # 返回包含学生特有信息的自我介绍
        return f"我是{self.name}，今年{self.age}岁，学号是{self.student_id}，专业是{self.major}。"

class Teacher(Person):
    """教师类，继承自Person类 - 演示继承的概念

    Teacher类也继承了Person类的所有属性和方法，
    并添加了教师特有的属性和方法。
    """
    
    # 重写__init__方法 - 添加教师特有的属性
    def __init__(self, name, age, employee_id, subject):
        """初始化教师对象

        Args:
            name (str): 教师姓名
            age (int): 教师年龄
            employee_id (str): 工号
            subject (str): 教授科目
        """
        # 调用父类的初始化方法
        super().__init__(name, age)  # 初始化name和age属性
        # 添加教师特有的属性
        self.employee_id = employee_id  # 工号
        self.subject = subject          # 教授科目
        self.students = []              # 学生列表
    
    # 添加教师特有的方法
    def assign_student(self, student):
        """分配学生方法 - 将学生添加到教师的学生列表

        Args:
            student (Student): 学生对象
        """
        self.students.append(student)  # 将学生添加到列表
        print(f"{self.name}老师现在教授{student.name}。")
    
    # 重写父类方法 - 提供教师特有的实现
    def introduce(self):
        """重写自我介绍方法 - 提供教师版本的自我介绍

        Returns:
            str: 教师的自我介绍
        """
        # 返回包含教师特有信息的自我介绍
        return f"我是{self.name}老师，今年{self.age}岁，工号是{self.employee_id}，教授{self.subject}。"

def inheritance_demo():
    print("\n=== 继承示例 ===")
    
    # 创建学生对象
    # Student类继承了Person类的所有功能，并添加了学生特有的功能
    student = Student("王五", 20, "S001", "计算机科学")
    print(student.introduce())  # 调用重写的introduce方法
    student.enroll_course("Python编程")  # 调用学生特有的方法
    student.enroll_course("数据结构")    # 调用学生特有的方法
    
    # 创建教师对象
    # Teacher类也继承了Person类的所有功能，并添加了教师特有的功能
    teacher = Teacher("赵六", 35, "T001", "Python编程")
    print(teacher.introduce())  # 调用重写的introduce方法
    teacher.assign_student(student)  # 调用教师特有的方法

# 主函数 - 程序的入口点
if __name__ == "__main__":
    inheritance_demo()